<?php
// 显示所有错误
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

echo "<div style='font-family: Arial, sans-serif; max-width: 800px; margin: 20px auto; padding: 20px; border: 1px solid #ddd; border-radius: 5px;'>";
echo "<h2>PDO用法修复工具</h2>";
echo "<p>这个工具会检查并修复admin目录中的PHP文件中的PDO用法问题，特别是将mysqli风格的bind_param()替换为正确的PDO参数绑定。</p>";

// 获取admin目录中的所有PHP文件
$admin_dir = __DIR__;
$files = scandir($admin_dir);
$php_files = [];

foreach ($files as $file) {
    if (pathinfo($file, PATHINFO_EXTENSION) === 'php') {
        $php_files[] = $file;
    }
}

echo "<h3>检查以下文件中的PDO用法问题：</h3>";
echo "<ul>";

$problems_found = 0;
$files_fixed = 0;

foreach ($php_files as $file) {
    $file_path = $admin_dir . '/' . $file;
    $content = file_get_contents($file_path);
    
    // 检查是否存在bind_param用法
    $bind_param_count = substr_count($content, '->bind_param');
    // 检查是否存在get_result用法
    $get_result_count = substr_count($content, '->get_result');
    // 检查是否存在fetch_assoc用法
    $fetch_assoc_count = substr_count($content, '->fetch_assoc');
    // 检查是否存在affected_rows用法
    $affected_rows_count = substr_count($content, '->rowCount()');
    
    $total_issues = $bind_param_count + $get_result_count + $fetch_assoc_count + $affected_rows_count;
    
    // 显示文件信息
    echo "<li>";
    echo "<strong>{$file}</strong>: ";
    
    if ($total_issues > 0) {
        $problems_found += $total_issues;
        echo "<span style='color: #f44336;'>发现 {$total_issues} 个PDO用法问题</span>";
        
        // 修复bind_param
        if ($bind_param_count > 0) {
            // 使用正则表达式匹配bind_param调用模式并替换为PDO风格
            $pattern = '/(\$[a-zA-Z0-9_]+)->bind_param\(\s*([\'"][a-z]+[\'"]),\s*(.*?)\);/';
            $content = preg_replace_callback($pattern, function($matches) {
                $stmt = $matches[1];
                $types = $matches[2]; // 我们不需要类型，PDO会自动处理
                $params = $matches[3];
                
                // 将参数分割并放入数组中
                $params_array = explode(',', $params);
                $params_array = array_map('trim', $params_array);
                
                return $stmt . '->execute([' . implode(', ', $params_array) . ']);';
            }, $content);
        }
        
        // 修复get_result
        if ($get_result_count > 0) {
            // 替换$result = $stmt，因为PDO不需要这一步
            $pattern = '/\$result\s*=\s*(\$[a-zA-Z0-9_]+)->get_result\(\);/';
            $content = preg_replace($pattern, '// PDO直接使用$stmt，无需get_result', $content);
            
            // 替换使用get_result()的地方
            $content = str_replace('', '', $content);
        }
        
        // 修复fetch_assoc
        if ($fetch_assoc_count > 0) {
            // 将$result->fetch(PDO::FETCH_ASSOC)替换为$stmt->fetch(PDO::FETCH_ASSOC)
            $content = str_replace('->fetch(PDO::FETCH_ASSOC)', '->fetch(PDO::FETCH_ASSOC)', $content);
        }
        
        // 修复affected_rows
        if ($affected_rows_count > 0) {
            // 将$stmt->rowCount()替换为$stmt->rowCount()
            $content = str_replace('->rowCount()', '->rowCount()', $content);
        }
        
        // 保存修改后的文件
        $backup_file = $file_path . '.bak';
        copy($file_path, $backup_file);
        file_put_contents($file_path, $content);
        
        echo " - <span style='color: #4caf50;'>已修复！原文件已备份为 {$file}.bak</span>";
        $files_fixed++;
    } else {
        echo "<span style='color: #4caf50;'>没有发现问题</span>";
    }
    
    echo "</li>";
}

echo "</ul>";

echo "<h3>修复总结：</h3>";
echo "<p>共发现 {$problems_found} 个PDO用法问题，修复了 {$files_fixed} 个文件。</p>";

echo "<div style='margin-top: 20px;'>";
echo "<a href='dashboard.php' style='display: inline-block; padding: 10px 15px; background-color: #2196f3; color: white; text-decoration: none; border-radius: 4px; margin-right: 10px;'>返回控制面板</a>";
echo "<a href='fix_database.php' style='display: inline-block; padding: 10px 15px; background-color: #4caf50; color: white; text-decoration: none; border-radius: 4px;'>运行数据库修复</a>";
echo "</div>";

echo "</div>";
?> 